Var
         s,err:word;
            en:boolean;
{-----------------------------------------}
Function gts:char;
BEGIN
gts:=tab_ras[getnit];
END;
{-----------------------------------------}
Procedure F; Forward;
{-----------------------------------------}
Procedure T;
Begin
 F;


 case getkll of
  'R':begin end;
  'S':begin
       case getnit of
        2,3,4,5,6,7,16:er('Ошибка в выражении',5);
       end;
      end;
   else
    er('Ошибка в выражении',5);
 end; {case}


 while (gts<>';') and (gts<>')') and (gts<>'+')
       and (gts<>'-') and (gts<>',') and (gts<>':')
       and (gts<>'>') and (gts<>'=') and (gts<>'<')
       and (getkll<>'S') do
 begin
   {PUSH AX} gencodbyte($50);
  if gts='*' then
                   begin
                    nextl;
                    F;
          {POP BX}  gencodbyte($5b);
         {iMUL BX}  gencodbyte($f7);
                    gencodbyte($EB);
                   end
            else
  if gts='/' then
                   begin
                    nextl;
                    F;
         {MOV BX,AX}gencodbyte($89);gencodbyte($c3);
         {POP AX}   gencodbyte($58);
         {XOR DX}   gencodbyte($31);gencodbyte($d2);
        {iDIV BX}   gencodbyte($f7);gencodbyte($FB);
                   end;

  end; {while}
 End;
{-----------------------------------------}
Procedure E;
Begin
 T;

 case getkll of
  'R':begin end;
  'S':begin
       case getnit of
        2,3,4,5,6,7,16:er('Ошибка в выражении',5);
       end;
      end;
   else
    er('Ошибка в выражении',5);
 end; {case}

 while (gts<>';') and (gts<>')') and (gts<>',')
   and (gts<>'>') and (gts<>'=') and (gts<>'<')
         and (getkll<>'S') and (gts<>':') do
  begin
    {PUSH AX}   gencodbyte($50);
  if gts='+' then
                   begin
                      nextl;
                      T;
           {POP BX}   gencodbyte($5B);
           {ADD AX,BX}gencodbyte($01);gencodbyte($D8);

                   end
            else
  if gts='-' then
                   begin
                    nextl;
                     T;
           {POP BX}      gencodbyte($5b);
           {SUB BX,AX}   gencodbyte($29);gencodbyte($c3);
           {MOV BX,AX}gencodbyte($89);gencodbyte($D8);
                   end;
   end;

 End;
{-----------------------------------------}
procedure F;
Var
 nm:word;
Begin
 case getkll of
  'R':begin
       if gts='(' then
                 begin
                   nextl;
                   E;
                   if gts<> ')' then
                     er('Ошибка в выражении',5)
                       else nextl;
                 end else
                  if en and (gts='-')
                    then begin
                       gencodbyte($B8);
                       gencodword(0);
                         end
                   else er('Ошибка в выражении',5);
      end;
  'D':begin
       val(tab_int[getnit],s,err);
       gencodbyte($B8);
       gencodword(s);
       nextl;
      end;
  'I':begin {id}
        if tp[getnit].iname=0
         then er('Неизвестная переменная',5);
       case tp[getnit].itype[1] of

        'I':begin {I}
             gencodbyte($A1);
             gencodword(tp[getnit].addr);
             nextl;
            end;   {I}
        'B':begin {B}
             gencodbyte($31);gencodbyte($C0);
             gencodbyte($A0);
             gencodword(tp[getnit].addr);
             nextl;
            end;  {B}

        'D':begin {DIM}
             nm:=getnit;
             nextl;
             if (getkll<>'R') or (getnit<>7)
              then er('Ожидался разделитель `(`',5);
             F;
             {теперь  AX число - ИНДЕКС МАССИВА}
             case tp[nm].itype[2] of
              'I':begin {DI}
                   gencodbyte($BB);gencodword(tp[nm].size);
                   gencodbyte($E8);gencodword(-(adc+2-$288));

                   gencodbyte($BB);gencodword($0002);
                   gencodbyte($F7);gencodbyte($E3);
                   gencodbyte($BB);gencodword(tp[nm].addr);
                   gencodbyte($01);gencodbyte($C3);
                   gencodbyte($8B);gencodbyte($07);
              { в AX значение элемента массива }
                  end;  {DI}
          'B','C':begin {B}
                   gencodbyte($BB);gencodword(tp[nm].size);
                   gencodbyte($E8);gencodword(-(adc+2-$288));

                   gencodbyte($BB);gencodword(tp[nm].addr);
                   gencodbyte($01);gencodbyte($C3);
                   gencodbyte($31);gencodbyte($C0);
                   gencodbyte($8A);gencodbyte($07);
              { в AL значение элемента массива }
                  end;  {B}

             end;  {case tp[getnit].type[2] of}

            end;  {DIM}

         else er('Ошибка в выражении',5);

       end; {case tp[getnit].type[1] of}

      end {id}

    else er('Ошибка в выражении',5);
 end {case getkll of}
End;
{=========================================}
